#include <xen/config.h>
#include <public/xen.h>
+#include <asm/asm_defns.h>
#include <asm/desc.h>
#include <asm/page.h>
#include <asm/msr.h>
mov %ecx,%gs
ljmp $(__HYPERVISOR_CS),$(1f)-__PAGE_OFFSET
1: lss stack_start-__PAGE_OFFSET,%esp
+ add $(STACK_SIZE-CPUINFO_sizeof-__PAGE_OFFSET),%esp
/* Reset EFLAGS (subsumes CLI and CLD). */
pushl $0
lidt idt_descr
cmp $(SECONDARY_CPU_FLAG),%ebx
- je init_secondary
+ je start_secondary
/* Call into main C routine. This should never return.*/
call __start_xen
/*** STACK LOCATION ***/
ENTRY(stack_start)
- .long cpu0_stack + STACK_SIZE - __PAGE_OFFSET
+ .long cpu0_stack
.long __HYPERVISOR_DS
/*** DESCRIPTOR TABLES ***/
#include <xen/config.h>
#include <public/xen.h>
+#include <asm/asm_defns.h>
#include <asm/desc.h>
#include <asm/page.h>
#include <asm/msr.h>
mov %rcx,%cr4
mov stack_start(%rip),%rsp
-
+ or $(STACK_SIZE-CPUINFO_sizeof),%rsp
+
/* Reset EFLAGS (subsumes CLI and CLD). */
pushq $0
popf
mov %ecx,%ss
lidt idt_descr(%rip)
-
+
cmp $(SECONDARY_CPU_FLAG),%ebx
- je init_secondary
+ je start_secondary
/* Initialize BSS (no nasty surprises!) */
lea __bss_start(%rip),%rdi
.quad idt_table
ENTRY(stack_start)
- .quad cpu0_stack + STACK_SIZE
+ .quad cpu0_stack
high_start:
.quad __high_start
static struct e820entry e820_raw[E820MAX];
-static multiboot_info_t *mbi;
-
-void __init start_of_day(void)
+void __init __start_xen(multiboot_info_t *mbi)
{
unsigned long vgdt, gdt_pfn;
char *cmdline;
startup_cpu_idle_loop();
}
-void __init __start_xen(multiboot_info_t *__mbi)
-{
- mbi = __mbi;
- reset_stack_and_jump(start_of_day);
-}
-
void arch_get_xen_caps(xen_capabilities_info_t info)
{
char *p = info;
/*
* Activate a secondary processor.
*/
-void __init start_secondary(void)
+void __init start_secondary(void *unused)
{
unsigned int cpu = cpucount;
startup_cpu_idle_loop();
}
-void __init init_secondary(void)
-{
- reset_stack_and_jump(start_secondary);
-}
-
extern struct {
void * esp;
unsigned short ss;
{
struct domain *idle;
struct vcpu *v;
- void *stack;
unsigned long boot_error;
int timeout, cpu;
unsigned long start_eip;
/* So we see what's up */
printk("Booting processor %d/%d eip %lx\n", cpu, apicid, start_eip);
- stack = alloc_xenheap_pages(STACK_ORDER);
-#if defined(__i386__)
- stack_start.esp = (void *)__pa(stack) + STACK_SIZE;
-#elif defined(__x86_64__)
- stack_start.esp = stack + STACK_SIZE;
-#endif
+ stack_start.esp = alloc_xenheap_pages(STACK_ORDER);
/* Debug build: detect stack overflow by setting up a guard page. */
- memguard_guard_stack(stack);
+ memguard_guard_stack(stack_start.esp);
/*
* This grunge runs the startup process for